/**
 * 文件上传脚本
 *
 * 该脚本用于在构建完成后将生成的文件上传到不同的目标平台，
 * 支持多种上传方式以适应不同的部署需求。
 *
 * 主要功能包括：
 * 1. 多平台上传支持：
 *    - SFTP：通过SFTP协议上传文件到服务器
 *    - AWS：上传文件到Amazon Web Services
 *    - OSS：上传文件到阿里云对象存储
 *    - GIT：通过Git命令提交和推送代码
 *
 * 2. 上传配置管理：
 *    - 根据环境配置选择上传方式
 *    - 动态获取上传所需的认证信息
 *    - 支持自定义上传JAR包路径
 *    - 支持上传前清理操作
 *
 * 3. 命令执行：
 *    - 生成并执行相应的上传命令
 *    - 记录执行的日志信息
 *    - 处理命令执行结果
 *    - 支持临时脚本文件的创建和清理
 *
 * 4. 参数处理：
 *    - 支持分发ID配置
 *    - 支持Git提交信息配置
 *    - 支持批量文件上传参数
 *    - 支持环境特定的上传配置
 *
 * 工作流程：
 * - 在构建完成后自动触发上传流程
 * - 检查是否有需要上传的文件
 * - 根据配置确定上传方式
 * - 获取相应的认证和配置信息
 * - 构造并执行上传命令
 * - 处理上传结果和日志记录
 *
 * 支持的上传类型：
 * - PushType.SFTP: 安全文件传输协议
 * - PushType.AWS: Amazon云服务
 * - PushType.OSS: 阿里云对象存储
 * - PushType.GIT: Git版本控制系统
 *
 * 配置参数：
 * - pushType: 上传方式配置
 * - packJarPath: 自定义上传工具JAR包路径
 * - distributionId: AWS分发ID
 * - gitContent: Git提交信息
 * - 用户认证信息: 各平台的访问密钥和配置
 *
 * 适用场景：
 * - 自动化部署流程
 * - 多环境发布管理
 * - 云服务资源上传
 * - 版本控制系统集成
 * - 持续集成/持续部署(CI/CD)
 */
package com.script

import com.PushType
import com.entity.PackPath
import com.utils.ScriptUtils.appConfig
import com.utils.ScriptUtils.contrastFile
import com.utils.ScriptUtils.rootPath
import com.utils.ScriptUtils.script
import com.utils.YamlUtil
import org.apache.logging.log4j.kotlin.logger
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
import kotlin.collections.get

script.onUpload = ::uploadHandler

// 执行扩展
private fun uploadHandler(): Boolean {

    println("确认命令:")
    println("执行提交方式= ${appConfig.runEnvironment().pushType}")

    val outFileStr = appConfig.global.uploadParent!!
    val changelength = contrastFile.addOssPush.size
    println("上传文件数量= $changelength")

    if (changelength == 0) return false

    //    print("任意键继续   q 取消")
    //    local state = scanner:next()
    //    if state~="q" and state~="Q" then
    return uploadNext(outFileStr.pathString)
    //    end


}

private fun uploadNext(outFileStr: String): Boolean {

    var scriptStr = "cd $outFileStr\n"
    val type = appConfig.runEnvironment().pushType

    logger.info(type.name)

    val ossPushData = contrastFile.ossPush.joinToString(" ")

    when (type) {
        PushType.SFTP -> {
            script.methodMap["runSFTP"]?.call(ossPushData)
            return false
        }

        PushType.AWS -> {
            var jarPath = "$rootPath/data/AWSPush.jar"

            if (appConfig.global.packJarPath != null)
                jarPath = appConfig.global.packJarPath!!

            var value = appConfig.user[YamlUtil.unpackEnvName]!!["aws"] as String
            if (value.isNotEmpty()) {
                // 保存到一个配置文件里面
                if (script.packCmd.clear) // 如果启动了清除命令
                    value = "$value -cls "

                if (appConfig.global.distributionId != null)
                    value = "$value dbId ${appConfig.global.distributionId} "

                val newFileStr = "$value $ossPushData"
                val uploadPackFile = PackPath(
                    "$rootPath/uploadConfig/${
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd_HH-mm-ss"))
                    }.txt"
                )
                uploadPackFile.writeText(newFileStr)

                scriptStr += " java -jar $jarPath -r ${uploadPackFile.pathString}"
                logger.info(scriptStr)
                println("执行script=$scriptStr")
                return contrastFile.exec("java", "-jar", jarPath, "-r", uploadPackFile.pathString)
            }
        }

        PushType.OSS -> {
            var jarPath = "${rootPath}/data/OSSPush.jar"
            if (appConfig.global.packJarPath != null)
                jarPath = appConfig.global.packJarPath!!

            val value = appConfig.user.get(YamlUtil.unpackEnvName)!!.get("aws") as String
            if (value.isNotEmpty()) {
                scriptStr += "java -jar $jarPath $value$ossPushData"
                logger.info(scriptStr)
                println("执行script=$scriptStr")
                return contrastFile.exec("java", "-jar", jarPath, "$value$ossPushData")
            }
        }

        PushType.GIT -> {
            scriptStr += "git add .\ngit commit -m '${YamlUtil.gitContent}'\ngit push"
            return runCmd(scriptStr)
            //contrastFile.exec("java", "-jar", jarPath, value..ossPushData)
        }
    }
    return false
}

private fun runCmd(script: String): Boolean {
    logger.info(script)
    val outFile = PackPath("$rootPath/data/tempCmd")
    outFile.writeText(script)
    //给新文件授权
    contrastFile.authorization(outFile)
    val result = contrastFile.exec(outFile.pathString)
    outFile.deleteRecursively()
    return result
}
